package com.xuecheng.content.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xuecheng.api.dto.TeachPlanAndMediaDTO;
import com.xuecheng.base.exception.ValidatedGroups;
import com.xuecheng.content.model.dto.BindTeachPlanMediaDTO;
import com.xuecheng.content.model.dto.SaveOrUpdateTeachPlanDTO;
import com.xuecheng.content.model.dto.TeachPlanDTO;
import com.xuecheng.content.model.po.Teachplan;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import java.util.List;

/**
 * <p>
 * 课程计划 服务类
 * </p>
 *
 * @author 勾新杰
 * @since 2024-12-21
 */
@Validated
public interface ITeachPlanService extends IService<Teachplan> {

    /**
     * 查询课程计划树形结构
     * @param courseId 课程id
     * @return 课程计划树形结构
     */
    List<TeachPlanDTO> queryTreeNodes(Long courseId);

    /**
     * 添加课程计划
     * @param saveTeachPlanDTO 添加课程计划信息
     */
    @Validated(ValidatedGroups.Insert.class)
    void save(@Valid SaveOrUpdateTeachPlanDTO saveTeachPlanDTO);

    /**
     * 修改课程计划
     * @param updateTeachPlanDTO 修改课程计划信息
     */
    @Validated(ValidatedGroups.Update.class)
    void update(@Valid SaveOrUpdateTeachPlanDTO updateTeachPlanDTO);

    /**
     * 删除课程计划
     * @param id 课程计划id
     */
    void deleteById(Long id);

    /**
     * 课程计划上移或者下移
     * @param id 课程计划id
     */
    void moveDownOrUp(Long id, boolean isDown);

    /**
     * 课程计划和媒资信息绑定
     * @param bindTeachPlanMediaDTO 课程计划和媒资信息绑定信息
     */
    void associationMedia(BindTeachPlanMediaDTO bindTeachPlanMediaDTO);

    /**
     * 删除课程计划和媒资信息绑定
     * @param teachPlanId 课程计划id
     * @param mediaId 媒资文件id
     */
    void deleteMedia(Long teachPlanId, String mediaId);

    /**
     * 根据课程计划id查询课程计划和媒资信息绑定信息
     *
     * @param teachplanId 课程计划id
     * @return 课程计划和媒资信息绑定信息
     */
    TeachPlanAndMediaDTO getTeachplanMedia(Long teachplanId);
}
